import * as THREE from "three";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
import { GUI } from "three/examples/jsm/libs/lil-gui.module.min.js"

// 创建场景
const scene = new THREE.Scene()

// 创建相机
const camera = new THREE.PerspectiveCamera(
  45, // 视角
  window.innerWidth / window.innerHeight, //宽高比
  0.1, // 近平面
  1000 // 远平面
)

// 创建渲染器
const renderer = new THREE.WebGLRenderer()
renderer.setSize(window.innerWidth, window.innerHeight) // 设置渲染器宽高
document.body.appendChild(renderer.domElement) // 将渲染器添加到body中

// 创建一个立方体
const cubeGeometry = new THREE.BoxGeometry(1, 1, 1) // 创建立方体几何体
const cubeMaterial = new THREE.MeshBasicMaterial({ color: 0xffffff }) // 创建材质
const cubeMaterial1 = new THREE.MeshBasicMaterial({ color: 0xffff00 }) // 创建材质
const cubeMaterial2 = new THREE.MeshBasicMaterial({ color: 0xff0000 }) // 创建材质
const cubeMaterial3 = new THREE.MeshBasicMaterial({ color: 0xff00ff }) // 创建材质
const cubeMaterial4 = new THREE.MeshBasicMaterial({ color: 0x00ff00 }) // 创建材质
const cubeMaterial5 = new THREE.MeshBasicMaterial({ color: 0x0000ff }) // 创建材质
const cube = new THREE.Mesh(cubeGeometry, [cubeMaterial, cubeMaterial1, cubeMaterial2, cubeMaterial3, cubeMaterial4, cubeMaterial5]) // 创建网格模型
cube.position.set(2, 0, 0) // 设置位置
scene.add(cube) // 将网格模型添加到场景中

// 创建缓冲区几何体
const geometry = new THREE.BufferGeometry()

// 使用索引绘制
const vertices = new Float32Array([
  -1, -1, 0,
  1, -1, 0,
  1, 1, 0,
  -1, 1, 0,


])
geometry.setAttribute("position", new THREE.BufferAttribute(vertices,3)) // 设置顶点数据
// 创建索引
const indices = new Uint8Array([
  0, 1, 2,
  2, 3, 0,
])
// 创建索引属性
geometry.setIndex(new THREE.BufferAttribute(indices, 1))

// 设置两个顶点组 形成两个材质
geometry.addGroup(0, 3, 0)
geometry.addGroup(3, 3, 1)

// 创建材质
const material = new THREE.MeshBasicMaterial({
  color: "#00ff00",
  // side:THREE.DoubleSide,
  wireframe: true
})
// 创建材质
const material1 = new THREE.MeshBasicMaterial({
  color: "#f00",
})
const plane = new THREE.Mesh(geometry, [material, material1])
console.log(geometry)
scene.add(plane)

// 创建轨道控制器
const controls = new OrbitControls(camera, renderer.domElement)
controls.enableDamping = true // 开启阻尼
controls.dampingFactor = 0.05 // 阻尼系数

// 设置相机位置
camera.position.z = 5
camera.position.y = 2
camera.position.x = 2
camera.lookAt(0, 0, 0)

// 添加世界辅助坐标器
const axisHelper = new THREE.AxesHelper(5)
scene.add(axisHelper)

function init() {
  controls.update() // 更新控制器
  requestAnimationFrame(init);
  renderer.render(scene, camera) // 渲染场景和相机
}

init() //初始化


// 全屏事件
let eventObj = {
  Fullscreen: function () {
    document.body.requestFullscreen()
  },
  ExitFullscreen: function () {
    document.exitFullscreen()
  }
}

// 创建Gui
const gui = new GUI()
gui.add(eventObj, "Fullscreen").name("全屏")
gui.add(eventObj, "ExitFullscreen").name("退出全屏")


// 创建一个组
const folder = gui.addFolder("立方体位置")

// 控制立方体位置
// gui.add(cube.position,"x",-5 , 5).name("立方体位置x")
/** 监听事件
 *  onChange : 每一次变动都会触发
 *  onFinishChange : 只有变动结束才会触发
 */
folder.add(cube.position, "x").min(-10).max(10).step(1).name("立方体位置x").onChange(val => console.log("立方体位置x : " + val))
folder.add(cube.position, "y").min(-10).max(10).step(1).name("立方体位置y").onFinishChange(val => console.log("立方体位置y : " + val))
folder.add(cube.position, "z").min(-10).max(10).step(1).name("立方体位置z")

gui.add(material, "wireframe").name("父元素线框模式")

const colorParams = {
  cubeColor: "#0f0",
}

gui.addColor(colorParams, "cubeColor").name("子元素颜色").onChange(val => {
  material.color = new THREE.Color(val)
})